<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>内存中堆和栈的区别 - Coding Night - A personal blog for Rango</title>
  <meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>

<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />

<meta name="theme-color" content="#f8f5ec" />
<meta name="msapplication-navbutton-color" content="#f8f5ec">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="#f8f5ec">


<meta name="author" content="Rango" /><meta name="description" content="对堆和栈的理解一直比较模糊，在看了网友的各种解释后，记录一下，以便日后查看。 数据结构中的栈和堆 首先，我们要知道堆栈是两种数据结构：堆和栈。 堆" />






<meta name="generator" content="Hugo 0.97.3 with theme even" />


<link rel="canonical" href="https://rangolee.github.io/post/%E5%86%85%E5%AD%98%E4%B8%AD%E5%A0%86%E5%92%8C%E6%A0%88%E7%9A%84%E5%8C%BA%E5%88%AB/" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/manifest.json">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">



<link href="/sass/main.min.a659bb31b17a54f7792e1bc783fc75b31118e6a175b42337b03fae0b1a3ef2b5.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.css" integrity="sha256-7TyXnr2YU040zfSP+rEcz29ggW4j56/ujTPwjMzyqFY=" crossorigin="anonymous">


<meta property="og:title" content="内存中堆和栈的区别" />
<meta property="og:description" content="对堆和栈的理解一直比较模糊，在看了网友的各种解释后，记录一下，以便日后查看。 数据结构中的栈和堆 首先，我们要知道堆栈是两种数据结构：堆和栈。 堆" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://rangolee.github.io/post/%E5%86%85%E5%AD%98%E4%B8%AD%E5%A0%86%E5%92%8C%E6%A0%88%E7%9A%84%E5%8C%BA%E5%88%AB/" /><meta property="article:section" content="post" />
<meta property="article:published_time" content="2016-05-09T00:00:00+00:00" />
<meta property="article:modified_time" content="2022-04-16T00:00:00+00:00" />

<meta itemprop="name" content="内存中堆和栈的区别">
<meta itemprop="description" content="对堆和栈的理解一直比较模糊，在看了网友的各种解释后，记录一下，以便日后查看。 数据结构中的栈和堆 首先，我们要知道堆栈是两种数据结构：堆和栈。 堆"><meta itemprop="datePublished" content="2016-05-09T00:00:00+00:00" />
<meta itemprop="dateModified" content="2022-04-16T00:00:00+00:00" />
<meta itemprop="wordCount" content="2258">
<meta itemprop="keywords" content="memory,stack,heap," /><meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="内存中堆和栈的区别"/>
<meta name="twitter:description" content="对堆和栈的理解一直比较模糊，在看了网友的各种解释后，记录一下，以便日后查看。 数据结构中的栈和堆 首先，我们要知道堆栈是两种数据结构：堆和栈。 堆"/>

<!--[if lte IE 9]>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.1.20170427/classList.min.js"></script>
<![endif]-->

<!--[if lt IE 9]>
  <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->

</head>
<body>
  <div id="mobile-navbar" class="mobile-navbar">
  <div class="mobile-header-logo">
    <a href="/" class="logo">Coding Night</a>
  </div>
  <div class="mobile-navbar-icon">
    <span></span>
    <span></span>
    <span></span>
  </div>
</div>
<nav id="mobile-menu" class="mobile-menu slideout-menu">
  <ul class="mobile-menu-list">
    <a href="/">
        <li class="mobile-menu-item">Home</li>
      </a><a href="/post/">
        <li class="mobile-menu-item">Archives</li>
      </a><a href="/tags/">
        <li class="mobile-menu-item">Tags</li>
      </a><a href="/categories/">
        <li class="mobile-menu-item">Categories</li>
      </a><a href="/about/">
        <li class="mobile-menu-item">About</li>
      </a>
  </ul>

  


</nav>

  <div class="container" id="mobile-panel">
    <header id="header" class="header">
        <div class="logo-wrapper">
  <a href="/" class="logo">Coding Night</a>
</div>





<nav class="site-navbar">
  <ul id="menu" class="menu">
    <li class="menu-item">
        <a class="menu-item-link" href="/">Home</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/post/">Archives</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/tags/">Tags</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/categories/">Categories</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/about/">About</a>
      </li>
  </ul>
</nav>

    </header>

    <main id="main" class="main">
      <div class="content-wrapper">
        <div id="content" class="content">
          <article class="post">
    
    <header class="post-header">
      <h1 class="post-title">内存中堆和栈的区别</h1>

      <div class="post-meta">
        <span class="post-time"> 2016-05-09 </span>
        <div class="post-category">
            <a href="/categories/memory/"> memory </a>
            </div>
          <span class="more-meta"> 约 2258 字 </span>
          <span class="more-meta"> 预计阅读 5 分钟 </span>
        
      </div>
    </header>

    <div class="post-toc" id="post-toc">
  <h2 class="post-toc-title">文章目录</h2>
  <div class="post-toc-content always-active">
    <nav id="TableOfContents">
  <ul>
    <li>
      <ul>
        <li><a href="#数据结构中的栈和堆">数据结构中的栈和堆</a>
          <ul>
            <li><a href="#栈-就像装数据的桶或箱子">栈 就像装数据的桶或箱子</a></li>
            <li><a href="#堆-就像一颗倒过来的树">堆 就像一颗倒过来的树</a></li>
          </ul>
        </li>
        <li><a href="#内存分配中的栈和堆">内存分配中的栈和堆</a>
          <ul>
            <li><a href="#看一个网上很流行的经典例子">看一个网上很流行的经典例子</a></li>
            <li><a href="#0申请方式和回收方式不同">0.申请方式和回收方式不同</a></li>
            <li><a href="#1申请后系统的响应">1.申请后系统的响应</a></li>
            <li><a href="#2申请效率的比较">2.申请效率的比较</a></li>
            <li><a href="#3申请大小的限制">3.申请大小的限制</a></li>
            <li><a href="#4堆和栈中存储的内容">4.堆和栈中存储的内容</a></li>
            <li><a href="#5存取效率的比较">5.存取效率的比较</a></li>
            <li><a href="#关于堆和栈区别的比喻">关于堆和栈区别的比喻</a></li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</nav>
  </div>
</div>
    <div class="post-content">
      <blockquote>
<p>对堆和栈的理解一直比较模糊，在看了网友的各种解释后，记录一下，以便日后查看。</p>
</blockquote>
<h2 id="数据结构中的栈和堆">数据结构中的栈和堆</h2>
<ul>
<li>首先，我们要知道<strong>堆栈</strong>是两种数据结构：<strong>堆</strong>和<strong>栈</strong>。</li>
<li><strong>堆</strong>和<strong>栈</strong>都是一种<strong>数据项按序排列</strong>的数据结构。</li>
</ul>
<h3 id="栈-就像装数据的桶或箱子">栈 就像装数据的桶或箱子</h3>
<p><strong>栈</strong>是具有<code>FILO</code>(<strong>先进后出</strong>)性质的数据结构。</p>
<ul>
<li>就如同我们想要取出放在箱子里面底下的东西（放入比较早的物体），需要先移开压在它上面的物体（放入比较晚的物体）。</li>
</ul>
<h3 id="堆-就像一颗倒过来的树">堆 就像一颗倒过来的树</h3>
<ul>
<li><strong>堆</strong>是一种<strong>经过排序</strong>的<strong>树形</strong>数据结构，每一个节点都有一个值。</li>
<li>通常我们所说的<strong>堆</strong>的数据结构，是指<strong>二叉堆</strong>。</li>
<li><strong>堆</strong>的特点是<strong>根结点</strong>的值最小/最大，且根结点的两个子树也是一个堆。
<ul>
<li>由于堆的这个特性，常用来实现优先队列，堆的存储是随意的，就如同在图书馆的书架上取书，虽然书的摆放是有顺序的，但是我们想取任意一本书时不必像栈一样，先要取出前面所有的书，书架的这种机制不同于箱子，我们可以直接取出我们想要的任意一本书。</li>
</ul>
</li>
</ul>
<h2 id="内存分配中的栈和堆">内存分配中的栈和堆</h2>
<p>内存分配中的堆和栈与数据结构中的堆和栈是有区别的。</p>
<p>下面说说C语言程序内存分配中的堆和栈，一般情况下，程序存放在 <code>ROM</code>（只读内存，比如硬盘）或 <code>Flash</code> 中，运行时需要拷贝到 <code>RAM</code>（随机存储器）中执行，<code>RAM</code> 会分别存储不同的信息，如下图所示：</p>
<p><img src="https://gitee.com/rangodev/pictures/raw/main/memory-1650086418037.jpg" alt="内存分配"></p>
<p>内存中的栈区处于相对较高的地址,以地址的增长方向为上的话:</p>
<ul>
<li><strong>栈</strong>地址是<strong>向下</strong>增长的，栈中分配<strong>局部变量</strong>空间；</li>
<li><strong>堆</strong>区是<strong>向上</strong>增长的，用于分配<strong>程序员申请的内存空间</strong>；</li>
<li>另外还有<strong>静态区</strong>，是分配<strong>静态变量，全局变量</strong>空间的；</li>
<li><strong>只读区</strong>是分配<strong>常量</strong>和<strong>程序代码</strong>空间的；以及其他一些分区。</li>
</ul>
<h3 id="看一个网上很流行的经典例子">看一个网上很流行的经典例子</h3>
<ul>
<li>main.cpp</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="c1">// 全局初始化区
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">char</span> <span class="o">*</span><span class="n">p1</span><span class="p">;</span><span class="c1">//全局未初始化区
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl"> <span class="kt">int</span> <span class="n">b</span><span class="p">;</span><span class="c1">//栈区
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kt">char</span> <span class="n">s</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;abc&#34;</span><span class="p">;</span><span class="c1">//栈区
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kt">char</span> <span class="o">*</span><span class="n">p2</span><span class="p">;</span><span class="c1">//栈区
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="kt">char</span> <span class="o">*</span><span class="n">p3</span> <span class="o">=</span> <span class="s">&#34;123456&#34;</span><span class="p">;</span><span class="c1">//123456\0在常量区，p3在栈区
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">static</span> <span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span><span class="c1">//全局（静态）初始化区
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">p1</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span><span class="c1">//堆区
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">p2</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="mi">20</span><span class="p">);</span><span class="c1">//堆区
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="0申请方式和回收方式不同">0.申请方式和回收方式不同</h3>
<p><strong>栈</strong>（stack）是系统自动分配空间，例如：我们定义一个 char a;系统会自动在栈上为其开辟空间。
<strong>堆</strong>（heap）则是程序员根据需要自己申请的空间，例如：malloc(10); 开辟十个字节的空间。
由于栈的空间是自动分配自动回收的，所以栈上的数据的生存周期只是在函数的运行过程中，运行结束就释放掉，不可以再访问。而堆上的数据只要程序员不释放空间，就一直可以访问到，不过缺点是一旦忘记释放会造成内存泄露。（MRC）（OC 的 ARC 下系统会自动释放）</p>
<h3 id="1申请后系统的响应">1.申请后系统的响应</h3>
<p><strong>栈</strong>：只要栈的剩余空间大于所申请的空间，系统就会为程序提供内存，否则将报异常提示栈溢出。
<strong>堆</strong>：首先应该知道操作系统有一个记录时间内存地址的链表，当系统收到程序的申请时，会遍历该链表，寻找第一个大于申请空间的的堆结点，然后将该结点从空闲链表中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内存空间中的首地址处记录本次分配的空间大小，这样，代码中的 delete 语句才能正确的释放内存空间。另外，由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部分重新放入空闲链表中。也就是说，<strong>堆会在申请后做一些后续工作，这就会引出申请效率的问题。</strong></p>
<h3 id="2申请效率的比较">2.申请效率的比较</h3>
<p><strong>栈</strong>：系统分配，速度快。但程序员无法控制。
<strong>堆</strong>：程序员申请的，一般速度比较慢，而且容易产生内存碎片，不过用起来方便。</p>
<h3 id="3申请大小的限制">3.申请大小的限制</h3>
<p><strong>栈</strong>：在 windows 下，栈是向低地址扩展的数据结构，是一块连续的内存区域，这句话的意思是栈顶的地址和栈的空间最大容量是系统预先规定好的，在 Windows 下，栈的大小是2M（也有的说是1M，总之是一个在编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将提升 overflow。因此能从栈获得的空间比较小。
<strong>堆</strong>：堆是向高地址扩展的数据结构，是不连续的内存区域。因为系统是由链表来存储的空闲地址的，自然是不连续的。而链表的遍历方向是由低地址向高地址的。堆得大小受限于计算机系统中有效的虚拟内存。由此可见，堆可以获得的空间比较灵活，也比较大。</p>
<h3 id="4堆和栈中存储的内容">4.堆和栈中存储的内容</h3>
<p><strong>由于栈的大小有限，所以用子函数还是有物理意义的，而不仅仅是裸机意义。</strong>
<strong>栈</strong>：在函数调用时，第一个进栈的是主函数中函数调用后的下一条指令（函数调用语句的下一条可执行语句）的地址，然后是函数的各个参数，在大多数的C编译器中，参数是由右向左入栈的，然后是函数中的局部变量。<!--注意静态变量是不入栈的-->
当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指向最开始存的地址，也就是主函数中的下一条指令，程序由该点继续运行。
<strong>堆</strong>：一般是在堆的头部用一个字节存放堆的大小信息。堆中的具体内容由程序员安排</p>
<h3 id="5存取效率的比较">5.存取效率的比较</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">s1</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;abc&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="o">*</span><span class="n">s2</span> <span class="o">=</span> <span class="s">&#34;ABC&#34;</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>abc 是在运行时赋值的，放在栈中。
ABC 是在编译时就确定的，放在堆中。
但是，在以后的存取中，在栈上的数组比指针所指向的字符串的存取速度要快（例如堆）。
比如：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> 
</span></span><span class="line"><span class="cl"><span class="cpf">void main(){</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span> <span class="kt">char</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kt">char</span> <span class="n">c</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;1234567890&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="kt">char</span> <span class="o">*</span><span class="n">p</span> <span class="o">=</span> <span class="s">&#34;1234567890&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="n">a</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"> <span class="n">a</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>对应的汇编代码:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">10: <span class="nv">a</span> <span class="o">=</span> c<span class="o">[</span>1<span class="o">]</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl"><span class="m">00401067</span> 8A 4D F1 mov cl,byte ptr <span class="o">[</span>ebp-0Fh<span class="o">]</span> 
</span></span><span class="line"><span class="cl">0040106A <span class="m">88</span> 4D FC mov byte ptr <span class="o">[</span>ebp-4<span class="o">]</span>,cl 
</span></span><span class="line"><span class="cl">11: <span class="nv">a</span> <span class="o">=</span> p<span class="o">[</span>1<span class="o">]</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">0040106D 8B <span class="m">55</span> EC mov edx,dword ptr <span class="o">[</span>ebp-14h<span class="o">]</span> 
</span></span><span class="line"><span class="cl"><span class="m">00401070</span> 8A <span class="m">42</span> <span class="m">01</span> mov al,byte ptr <span class="o">[</span>edx+1<span class="o">]</span> 
</span></span><span class="line"><span class="cl"><span class="m">00401073</span> <span class="m">88</span> <span class="m">45</span> FC mov byte ptr <span class="o">[</span>ebp-4<span class="o">]</span>,al
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="关于堆和栈区别的比喻">关于堆和栈区别的比喻</h3>
<p>堆和栈的区别可以引用一位前辈的比喻来看出：</p>
<blockquote>
<p>使用<strong>栈</strong>就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自由度小。</p>
<p>使用<strong>堆</strong>就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由度大。比喻很形象。</p>
</blockquote>

    </div>

    <div class="post-copyright">
  <p class="copyright-item">
    <span class="item-title">文章作者</span>
    <span class="item-content">Rango</span>
  </p>
  <p class="copyright-item">
    <span class="item-title">上次更新</span>
    <span class="item-content">
        2022-04-16
        
    </span>
  </p>
  
  
</div>
<div class="post-reward">
  <input type="checkbox" name="reward" id="reward" hidden />
  <label class="reward-button" for="reward">赞赏支持</label>
  <div class="qr-code">
    
    <label class="qr-code-image" for="reward">
        <img class="image" src="/img/reward/wechat.jpg">
        <span>微信打赏</span>
      </label>
    <label class="qr-code-image" for="reward">
        <img class="image" src="/img/reward/alipay.jpg">
        <span>支付宝打赏</span>
      </label>
  </div>
</div><footer class="post-footer">
      <div class="post-tags">
          <a href="/tags/memory/">memory</a>
          <a href="/tags/stack/">stack</a>
          <a href="/tags/heap/">heap</a>
          </div>
      <nav class="post-nav">
        <a class="prev" href="/post/ios/kvc-%E5%92%8C-kvo/">
            <i class="iconfont icon-left"></i>
            <span class="prev-text nav-default">KVC 和 KVO</span>
            <span class="prev-text nav-mobile">上一篇</span>
          </a>
        <a class="next" href="/post/others/front-matter/">
            <span class="next-text nav-default">Github上的 MarkDown 前页格式</span>
            <span class="next-text nav-mobile">下一篇</span>
            <i class="iconfont icon-right"></i>
          </a>
      </nav>
    </footer>
  </article>
        </div>
        

  

  

      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="social-links">
      <a href="mailto:rangodev@163.com" class="iconfont icon-email" title="email"></a>
  <a href="https://rangolee.github.io/index.xml" type="application/rss+xml" class="iconfont icon-rss" title="rss"></a>
</div>

<div class="copyright">
  <span class="power-by">
    由 <a class="hexo-link" href="https://gohugo.io">Hugo</a> 强力驱动
  </span>
  <span class="division">|</span>
  <span class="theme-info">
    主题 - 
    <a class="theme-link" href="https://github.com/olOwOlo/hugo-theme-even">Even</a>
  </span>

  

  <span class="copyright-year">
    &copy; 
    2016 - 
    2022<span class="heart"><i class="iconfont icon-heart"></i></span><span>Rango</span>
  </span>
</div>

    </footer>

    <div class="back-to-top" id="back-to-top">
      <i class="iconfont icon-up"></i>
    </div>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/slideout@1.0.1/dist/slideout.min.js" integrity="sha256-t+zJ/g8/KXIJMjSVQdnibt4dlaDxc9zXr/9oNPeWqdg=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.js" integrity="sha256-XVLffZaxoWfGUEbdzuLi7pwaUJv1cecsQJQqGLe7axY=" crossorigin="anonymous"></script>



<script type="text/javascript" src="/js/main.min.64437849d125a2d603b3e71d6de5225d641a32d17168a58106e0b61852079683.js"></script>








</body>
</html>
